package com.example.myapplication.kotlin

/*
数据类是最常用的 Kotlin 特性之一，
专门用于存储和传输数据，能自动生成常用方法，
极大减少代码量
*/
/**
 * 数据类示例 - 展示data class的各种特性和自动生成的方法
 */
data class User(
    val id: Int,
    val name: String,
    val email: String,
    val age: Int = 18  // 带默认值的属性
) {
    // 可以添加自定义方法
    fun isAdult(): Boolean = age >= 18
}

/**
 * 普通类用于对比
 */
class NormalUser(
    val id: Int,
    val name: String,
    val email: String,
    val age: Int = 18
) {
    fun isAdult(): Boolean = age >= 18

    // 普通类需要手动重写这些方法才能获得正确的比较行为(了解)
    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (other !is NormalUser) return false
        return id == other.id && name == other.name && email == other.email && age == other.age
    }

    override fun hashCode(): Int {
        var result = id
        result = 31 * result + name.hashCode()
        result = 31 * result + email.hashCode()
        result = 31 * result + age
        return result
    }

    override fun toString(): String {
        return "NormalUser(id=$id, name=$name, email=$email, age=$age)"
    }
}

fun main() {
    // 创建数据类实例
    val user1 = User(1, "张三", "zhangsan@example.com", 25)
    val user2 = User(1, "张三", "zhangsan@example.com", 25)
    val user3 = User(2, "李四", "lisi@example.com")

    // 1. equals() 方法 - 按属性比较
    println("=== equals() 方法演示 ===")
    println("user1 == user2: ${user1 == user2}")  // true - 属性完全相同
    println("user1 == user3: ${user1 == user3}")  // false - 属性不同

    // 2. toString() 方法 - 友好的字符串表示
    println("\n=== toString() 方法演示 ===")
    println("user1: $user1")  // User(id=1, name=张三, email=zhangsan@example.com, age=25)
    println("user3: $user3")  // User(id=2, name=李四, email=lisi@example.com, age=18)

    // 3. copy() 方法 - 创建副本并可选修改属性
    println("\n=== copy() 方法演示 ===")
    val user1Copy = user1.copy()
    val user1Updated = user1.copy(age = 26, email = "newemail@example.com")
    println("原始用户: $user1")
    println("复制用户: $user1Copy")
    println("更新后的用户: $user1Updated")

    // 4. componentN() 方法 - 解构声明
    println("\n=== componentN() 方法演示 ===")
    val (id, name, email, age) = user1  // 自动调用 component1(), component2() 等
    println("通过解构获取的值: id=$id, name=$name, email=$email, age=$age")

    // 5. 与普通类的对比
    println("\n=== 与普通类对比 ===")
    val normalUser1 = NormalUser(1, "张三", "zhangsan@example.com", 25)
    val normalUser2 = NormalUser(1, "张三", "zhangsan@example.com", 25)
    println("普通类按引用比较: ${normalUser1 == normalUser2}")  // false - 不同实例
    println("普通类toString: $normalUser1")

    // 6. 使用自定义方法
    println("\n=== 自定义方法演示 ===")
    println("${user1.name}是成年人: ${user1.isAdult()}")  // true
    println("${user3.name}是成年人: ${user3.isAdult()}")  // false
}
